package com.gang.common.lib.utils;

import cn.hutool.core.io.FileUtil;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Classname FileUtils
 * @Description TODO
 * @Date 2019/11/6 21:10
 * @Created by ant-black 1016930479@qq.com
 */
public class FileUtils {


    /**
     * @param file
     * @return
     */
    public static String getFileContent(File file) {
        return FileUtil.readString(file, "UTF-8");
    }


    /**
     * @param filePath
     * @return
     */
    public static Map<String, File> getFilesMapNoSuffix(String filePath) {
        File file = new File(filePath);
        Map<String, File> fileMap = new HashMap();
        if (FileUtil.isNotEmpty(file)) {
            List<File> files = Arrays.asList(file.listFiles());
            files.forEach(item -> {
                String itemCode = item.getName()
                        .replaceAll("[.][^.]+$", "");
                //                        .replaceAll(" ", "");
                fileMap.put(itemCode, item);
            });

        }
        return fileMap;
    }


    /**
     * @param filePath
     * @return
     */
    public static Map<String, File> getFilesMap(String filePath) {
        File file = new File(filePath);
        Map<String, File> fileMap = new HashMap();
        if (FileUtil.isNotEmpty(file)) {
            List<File> files = Arrays.asList(file.listFiles());
            files.forEach(item -> {
                fileMap.put(item.getName(), item);
            });

        }
        return fileMap;
    }

    /**
     * @param filePath
     * @return
     */
    public static List<File> getFiles(String filePath) {
        File file = new File(filePath);
        List<File> files = Arrays.asList(file.listFiles());
        return files;
    }


    /**
     * @Description：获取某个目录下所有直接下级文件，不包括目录下的子目录的下的文件
     */
    public static List<String> getFilesName(String path) {
        List<String> files = new ArrayList<>();
        File file = new File(path);
        File[] tempList = file.listFiles();

        for (int i = 0; i < tempList.length; i++) {
            if (tempList[i].isFile()) {
                files.add(tempList[i].toString());
            }
        }
        return files;
    }


    /**
     * 获取所有文件
     *
     * @param path
     * @param list
     */
    public static void getAllFileName(String path, ArrayList<String> list) {
        File file = new File(path);
        //获取全部File
        //返回目录名加文件名
        //添加过滤器
        String[] strings = file.list();
        for (String string : strings) {
            System.out.println(string);
        }
        //这些路径名表示此抽象路径名所表示目录中的文件。
        File[] files = file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return true;
            }
        });

        for (int i = 0; i < files.length; i++) {
            //判断是否是目录，是的话继续递归
            if (files[i].isDirectory()) {
                getAllFileName(files[i].getAbsolutePath(), list);
            } else {
                //否则添加到list
                //获取全部文件名
                list.add(files[i].getName());

                //获取全部包+文件名
                //list.add(files[i].getAbsolutePath());
            }
        }
    }


    /**
     * 需要注意的是当删除某一目录时，必须保证该目录下没有其他文件才能正确删除，否则将删除失败。
     *
     * @param folder
     * @throws Exception
     */
    public static void deleteFolder(File folder) throws Exception {
        if (!folder.exists()) {
            throw new Exception("文件不存在");
        }
        File[] files = folder.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                    //递归直到目录下没有文件
                    deleteFolder(file);
                } else {
                    //删除
                    file.delete();
                }
            }
        }
        //删除
        folder.delete();

    }


    /**
     * 判断文件夹是否存在
     */
    public void fileExists(String url) {
        System.out.println(url);
        File dir = new File(url);
        // 判断文件夹是否存在
        if (dir.exists()) {
            if (dir.isDirectory()) {
                System.out.println("dir exists");
            } else {
                System.out.println("the same name file exists, can not create dir");
            }
        } else {
            System.out.println("dir not exists, create it ...");
            dir.mkdir();
        }
    }

    /**
     * check this path is exits
     * if not , create it and back
     *
     * @param filePath
     * @return
     */
    public static File isExistDirAndBack(String filePath) {
        isExistDir(filePath);
        return new File(filePath);
    }

    /**
     * 判断多级路径是否存在，不存在就创建
     *
     * @param filePath 支持带文件名的Path：如：D:\news\2014\12\abc.text，和不带文件名的Path：如：D:\news\2014\12
     */
    public static void isExistDir(String filePath) {
        String paths[] = {""};
        //切割路径
        try {
            String tempPath = new File(filePath).getCanonicalPath();//File对象转换为标准路径并进行切割，有两种windows和linux
            paths = tempPath.split("\\\\");//windows
            if (paths.length == 1) {
                paths = tempPath.split("/");
            }//linux
        } catch (IOException e) {
            System.out.println("切割路径错误");
            e.printStackTrace();
        }
        //判断是否有后缀
        boolean hasType = false;
        if (paths.length > 0) {
            String tempPath = paths[paths.length - 1];
            if (tempPath.length() > 0) {
                if (tempPath.indexOf(".") > 0) {
                    hasType = true;
                }
            }
        }
        //创建文件夹
        String dir = paths[0];
        for (int i = 0; i < paths.length - (hasType ? 2 : 1); i++) {// 注意此处循环的长度，有后缀的就是文件路径，没有则文件夹路径
            try {
                dir = dir + "/" + paths[i + 1];//采用linux下的标准写法进行拼接，由于windows可以识别这样的路径，所以这里采用警容的写法
                File dirFile = new File(dir);
                if (!dirFile.exists()) {
                    dirFile.mkdir();
                    System.out.println("成功创建目录：" + dirFile.getCanonicalFile());
                }
            } catch (Exception e) {
                System.err.println("文件夹创建发生异常");
                e.printStackTrace();
            }
        }
    }
}
